<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <script>
        /*
            1. 重要语法
                    new Promise(executor)构造函数
                    Promise.prototype.then方法

            2. 基本编码流程
                    1.创建Promise的实例对象(pending状态)，传入executor函数
                    2.在executor中启动异步任务(定时器、ajax请求)
                    3.根据异步任务的结果，做不同处理：
                            3.1 如果异步任务成功了
                                    我们调用了resolve(value)，让promise实例对象状态变为成功(fulfilled)，同时指定成功的value
                            3.2 如果异步任务失败了
                                    我们调用了reject(reason)，让promise实例对象的状态变为失败(rejected)，同时指定失败的reason
                    4.通过then方法为promise的实例指定成功、失败的回调，来获取成功的value、失败的reason
                            注意：then方法所指定的：成功的回调、失败的回调，都是异步的回调
            
            3. 关于状态的注意点：
                    1.三个状态
                            pending: 未确定的-----初始状态
                            fulfilled: 成功的----调用resolve()方法
                            rejected: 失败的----调用reject()方法
                    2.两种状态改变
                            pending ==> fulfilled
                            pending ==> rejected
                    3.状态是只能改变一次的
                    4.一个promise指定多个成功/失败的回调函数, 都会调用吗?
        */

        // 注意executor是同步的，这个函数通常会写一些异步任务
        let p = new Promise((resolve,reject)=>{
            // 定时器本身也是同步的，只是里面的这个回调函数是异步的
            setTimeout(() => {
                let time = new Date().getTime()
                if(time%2==0){
                    resolve(200)
                }
                else{
                    reject(404)
                }
            }, 2000);  
        })

        p.then(
            // 成功的回调函数
            (res)=>{
                console.log(res)
            },
            // 失败的回调函数
            (err)=>{
                console.log(err)
            }
        )

        p.then(
            (res)=>{
                console.log(res)
            },
            (err)=>{
                console.log(err)
            }
        )
    </script>
</body>
</html>